package cn.tedu.csmall.stock.webapi.controller;

import cn.tedu.csmall.commons.pojo.stock.dto.StockReduceCountDTO;
import cn.tedu.csmall.commons.restful.JsonResult;
import cn.tedu.csmall.commons.restful.ResponseCode;
import cn.tedu.csmall.stock.service.IStockService;
import cn.tedu.csmall.stock.webapi.error.StockBlockError;
import cn.tedu.csmall.stock.webapi.error.StockFallbackError;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Api(tags = "库存模块")
@RequestMapping("/base/stock")
public class StockController {
    @Autowired
    private IStockService stockService;


    @PostMapping("/reduce/count")
    @ApiOperation("减少商品库存")
    //@SentinelResource注解标记的控制层方法，会被Sentinel进行管理
    //这个方法需要运行一次，才可以在Sentinel的仪表盘界面中进行限流规则的设置
    //"减少库存的方法"设置当前方法在仪表盘中的显示的资源名称
    //blockHandler指定请求被限流时运行的方法的名称blockError
    //fallback指定请求在处理过程中出异常时运行的方法名称fallbackError
    @SentinelResource(value = "减少库存的方法"
            ,blockHandlerClass = StockBlockError.class,blockHandler = "blockError"
            ,fallbackClass = StockFallbackError.class, fallback = "fallbackError")
    public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
        //模拟降级过程
        if(Math.random()<0.8)
            System.out.println(2/0);
        stockService.reduceStockByCommodityCode(stockReduceCountDTO);
        return JsonResult.ok("减少商品库存完成！");
    }
    //自定义限流方法的规则
    //1.访问修饰符是public
    //2.返回值类型必须要和被限流的方法一致
    //3.方法名称必须是被限流方法上限流注解上blockHandler指定的方法名
    //4.方法参数列表需要和被限流的方法一致，除此之外还需要添加一个BlockException类型的参数
//    public JsonResult blockError(StockReduceCountDTO stockReduceCountDTO,
//                                 BlockException blockException){
//        //限流方法一般直接返回限流信息即可
//        return JsonResult.failed(ResponseCode.BAD_REQUEST,"服务器繁忙，请稍后重试~");
//    }
    //自定义降级方法
    //1.访问修饰符是public
    //2.返回值类型必须要和被降级的方法一致
    //3.方法名称必须是被降级方法上降级注解上fallback指定的方法名
    //4.方法参数列表需要和被降级的方法一致，还可以添加一个异常的参数类型
//    public JsonResult fallbackError(StockReduceCountDTO stockReduceCountDTO){
//        //直接返回降级提示，也可以做其他的处理
//        return JsonResult.failed(ResponseCode.BAD_REQUEST,"运行方法失败，服务降级");
//    }
}
